/**
 * @description user controller 业务逻辑
 * @author malin
 */

const { SuccessModel, ErrorModel } = require('../model/ResModel')
const { getUserInfo, createUser, deleteUser, updateUser } = require('../services/user')
const { 
    registerUserNameExistInfo,
    registerUserNameNotExistInfo,
    loginFailInfo,
    deleteUserFailInfo,
    changeInfoFailInfo,
    changePasswordFailInfo
} = require('../model/ErrorInfo')
const doCrypto = require('../utils/cryp')

/**
  * 用户名是否存在
  * @param {string} userName 用户名 
  */
async function isExist(userName) {
    // 业务逻辑处理（暂时没有）
    // 直接调用service层获取数据
    const userInfo = await getUserInfo(userName)
    if(userInfo) {
        // 用户名已存在
        return new SuccessModel(userInfo)
        // res：{ code:0, data: {....} }
    } else {
        // 用户名不存在
        return new ErrorModel(registerUserNameNotExistInfo)
        // res：{ code: 10003, msg: '用户不存在 } 说明用户名可用
    }
}

/**
 * 用户注册
 * @param {string} userName 
 * @param {string} password 
 * @param {number} gender 1 man 2 women 3 保密 
 */
async function register({ userName, password, gender }) {
    // 解构的好处 1、不用再使用 obj.userName 调用 2、参数的顺序任意
    // 业务逻辑：先判断下用户名是否存在
    const userInfo = await getUserInfo(userName)
    if(userInfo) {
        // 用户名已存在
        return new ErrorModel(registerUserNameExistInfo)
    }
    // 调用service层，实现注册
    try {
        //使用了解构，传参顺序不限
        await createUser({ 
            userName, 
            password: doCrypto(password), 
            gender
        })
        return new SuccessModel()
    } catch(err) {
        console.error(err.message, err.stack)
        return new ErrorModel(registerFailInfo)
    }
}

/**
 * 登录
 * @param {string} userName 
 * @param {string} password 
 * @param {object} ctx koa2 ctx
 */
async function login({ userName, password, ctx }) {
    // 登录成功 将用户信息放进session
    // ctx.session.userInfo = 
    // 获取用户信息（密码要记得加密）
    const userInfo = await getUserInfo(userName, doCrypto(password))
    if(!userInfo) {
        // 登录失败
        return new ErrorModel(loginFailInfo)
    }
    // 登录成功
    if(!ctx.session.userInfo) {
        ctx.session.userInfo = userInfo
    }
    return new SuccessModel()
}

/**
 * 删除当前用户
 * @param {string} userName 
 */
async function deleteCurrUser(userName) {
    // 调用service层
    const result = await deleteUser(userName)
    if(result) {
        return new SuccessModel()
    }
    return new ErrorModel(deleteUserFailInfo)
}

/**
 * 修改个人信息
 * @param {object} ctx 修改完个人信息后再修改session
 * @param {string} nickName 
 * @param {string} city 
 * @param {string} picture 
 */
async function changeInfo(ctx, { nickName, city, picture }) {
    const { userName } = ctx.session.userInfo
    if(!nickName) {
        nickName = userName
    }
    // service
    const result = await updateUser({ 
        newNickName: nickName, 
        newCity: city, 
        newPicture: picture }, { userName })
    if(result) {
        Object.assign(ctx.session.userInfo, {
            nickName,
            city,
            picture
        })
        return new SuccessModel()
    }
    return new ErrorModel(changeInfoFailInfo)
}

/**
 * 修改密码
 * @param {string} userName 
 * @param {string} password 
 * @param {string} newPassword 
 */
async function changePassword({ userName, password, newPassword }) {
    // service
    const result = await updateUser({
        newPassword: doCrypto(newPassword)  // 要修改的内容
    }, { userName, password: doCrypto(password) })  // 查询条件
    if(result) {
        return new SuccessModel()
    }
    return new ErrorModel(changePasswordFailInfo)
}

/**
 * 退出登录
 * @param {object} ctx 
 */
async function logout(ctx) {
    delete ctx.session.userInfo
    return new SuccessModel()
}

module.exports = {
    isExist,
    register,
    login,
    deleteCurrUser,
    changeInfo,
    changePassword,
    logout
}
